1 module unde.games.dizzy.omega.animations.bag_bug_anim;
2 
3 import derelict.opengl3.gl;
4 
5 import std.conv;
6 import unde.games.dizzy.omega.bug;
7 import unde.games.object;
8 import unde.games.renderer;
9 import unde.global_state;
10 
11 class BagBugAnim:GameObject
12 {
13     enum SPEED = 0.05;
14     enum G = 0.015;
15     enum MAX_V = 0.05;
16     enum JUMP_V = 0.1;
17     
18     long frame = -1;
19     int stage;
20 
21     Bug bug;
22     float dz = 0.0;
23 
24     this(MainGameObject root)
25     {
26         bug = new Bug(root, [302.6, 34.4, 3.0], "solid");
27         bug.dx = -SPEED;
28         models["bag"] = root.models["bag"];
29         super(root);
30     }
31 
32     void start()
33     {
34         if (frame < 0) frame = 0;
35     }
36 
37     override void draw(GlobalState gs)
38     {
39         if (frame >= 0 && bug.x > 284.0)
40         {
41             bug.draw(gs);
42             
43             glPushMatrix();
44             glTranslatef(bug.x, bug.y+0.5, bug.z);
45             recursive_render(gs, models["bag"]);
46             glPopMatrix();
47         }
48     }
49 
50     override bool tick(GlobalState gs)
51     {
52         if (frame >= 0 && bug.x > 284.0)
53         {
54             frame++;
55             bug.x += bug.dx;
56             bug.y += bug.dy;
57             bug.z += dz;
58 
59             switch(stage)
60             {
61                 case 0:
62                     if (bug.x <= 299.2)
63                     {
64                         bug.dy = JUMP_V;
65                         stage++;
66                     }
67                     break;
68                 case 1:
69                     bug.dy -= G;
70                     if (bug.y <= 29.4)
71                     {
72                         bug.dy = 0;
73                         dz = -SPEED;
74                         stage++;
75                     }
76                     break;
77                 case 2:
78                     if (bug.z <= 1.5)
79                     {
80                         bug.dy = JUMP_V;
81                         stage++;
82                     }
83                     break;
84                 case 3:
85                     bug.dy -= G;
86                     if (bug.y <= 26.4)
87                     {
88                         bug.dy = 0.0;
89                         bug.dx = -SPEED;
90                         stage++;
91                     }
92                     break;
93                 case 4:
94                     if (bug.z <= -3.0)
95                     {
96                         dz = 0;
97                         stage++;
98                     }
99                     break;
100                 default:
101                     break;
102             }
103         }
104 
105         return true;
106     }
107 
108     void load(string[string] s)
109     {
110         bug.load(s);
111 
112         if ("bag-bug-dz" in s)
113             dz = s["bag-bug-dz"].to!(float);
114         else
115         {
116             dz = 0.0;
117             bug.dx = -SPEED;
118         }
119 
120         if ("bag-bug-frame" in s)
121             frame = s["bag-bug-frame"].to!(long);
122         else
123             frame = -1;
124 
125         if ("stage" in s)
126             stage = s["bag-bug-stage"].to!(int);
127         else
128             stage = 0;
129     }
130 
131     void save(ref string[string] s)
132     {
133         if (frame >= 0)
134         {
135             bug.save(s);
136             s["bag-bug-dz"] = dz.to!(string);
137             s["bag-bug-frame"] = frame.to!(string);
138             s["bag-bug-stage"] = stage.to!(string);
139         }
140     }
141 }